Stivuirea containerelor
Neptune Cargo Company gestioneaza o magazie de depozitare a containerelor.

Containerele sosesc la magazie pentru depozitare din ora in ora. Ele stau in depozit un numar (intreg pozitiv) de ore. Cand soseste un container, documentatia lui contine momentul (ora) in care acesta ar trebui scos din magazie. Primul container soseste la momentul 1. Momentul in care se cere scoaterea unui container poate precede sau succede momentul dat in documentatie, cu maxim 5 ore.  

In aceasta problema timpul este exprimat ca un intreg pozitiv din intervalul [1, 150].

O macara opereaza deasupra spatiului de stocare putand:
* aduce containere in magazie 
* scoate containere din magazie
* muta containerele dintr-un loc in altul
Problema:
Scrieti un program care sa ofere o strategie de intrare, stocare si scoatere a containerelor din magazie. Strategia este buna daca minimizeaza numarul total de miscari efectuate de macara. Magazia are forma unui paralelipiped cu dimensiunile X (lungime), Y (latime) si Z (inaltime). 

X,Y,Z sunt numere intregi si nu vor depasi valoarea 32.

Fiecare container este un cub 1x1x1. El poate fi stocat pe podea sau peste alt container. Macaraua poate muta doar containerul din varful unei astfel de stive. 

Mutarea unui container dintr-un loc in altul reprezinta o miscare a macaralei. Toate miscarile macaralei sunt instantanee si se fac intre intrari si iesiri ale containerelor. Cand magazia se umple, programul tau trebuie sa refuze intrarea altor containere. De asemenea programul tau poate fi mai putin eficient sau poate sa nu continue manevrarea containerelor atunci cand depozitul este aproape plin. Programul tau poate refuza intrarea de containere in orice moment. 
Input:
Programul tau trebuie sa interactioneze cu o biblioteca de simulare care va oferi date la care programul tau trebuie sa genereze actiuni si mesaje. La inceputul programului magazia este goala.
In timpul testarii programului, biblioteca va returna valori corecte pentru un set mic de date de test.

Fiecare container este identificat printr-un numar intreg pozitiv.

Programul tau poate apela urmatoarele functii: 

function GetX: integer; Returneaza lungimea magaziei;

function GetY: integer; Returneaza latimea magaziei;

function GetZ: integer; Returneaza inaltimea magaziei;

Urmatoarele functii ofera informatia referitoare la secventa de actiuni (intrarea si iesirea containerelor). Intrarile sunt facute la ora fixa, iar cererile de iesire sunt primite in interiorul unei ore. Deci, fiecare intrare marcheaza trecerea unei ore.
 
function GetNextContainer: integer;
Returneaza un numar intreg pozitiv reprezentand numarul containerului care va fi stocat sau scos. Daca nu mai sunt containere, returneaza valoarea 0, care indica terminarea programului tau, chiar daca in magazie mai exista, eventual, containere.
   
function GetNextAction: integer;
Returneaza un numar intreg reprezentand actiunea care trebuie facuta: 
1- stocarea unui nou container
2- iesirea unui container

 function GetNextStorageTime: integer;
Returneaza timpul, in ore (de la inceput) cand se preconizeaza iesirea unui container. Aceasta valoare foloseste in planificarea iesirilor programului tau; cererea reala de iesire poate fi facuta la un alt timp, care nu difera insa de cel preconizat cu mai mult de 5 ore. Aceasta functie da o valoare corecta doar in cazul cand GetNextAction returneaza valoarea 1. 

Ordinea in care sunt apelate aceste trei functii nu este importanta.
 
Apeluri consecutive ale functiilor GetNextContainer, GetNextAction, GetNextStorageTime vor returna intotdeauna informatii despre acelasi container, pana cand containerul este refuzat, stocat sau scos; din acel moment functiile vor returna informatie despre urmatorul container.
(continuare pe pagina 2)
Output:
Odata ce programul tau a aflat informatia necesara despre urmatorul container, el va folosi urmatoarele functii pentru a manipula stocurile din magazie.

function MoveContainer(x1, y1, x2, y2: integer): integer;
Muta containerul din varful stivei de coordonate (x1, y1) in varful stivei de coordonate (x2, y2). 
Returneaza :
1  - daca actiunea este valida, 
0  - daca este imposibila (ilegala).
 
procedure RefuseContainer;
Refuza intrarea unui container

procedure StoreArrivingContainer(x, y: integer);
Stocheaza containerul intrat in varful stivei de coordonate (x, y).

procedure RemoveContainer(x, y: integer);
Scoate containerul din varful stivei de coordonate 
(x, y). Daca  programul tau nu poate efectua aceasta operatie, el trebuie sa se termine.

Miscarile ilegale sunt ignorate de biblioteca si nu au nici un efect in simularea sau calculul scorului.

Programul tau NU TREBUIE sa scrie nimic la iesire. Biblioteca cu care interactioneaza programul tau va crea un fisier de actiuni care este folosit pentru evaluare.
 
Ordinea de prelucrare a comenzilor:
Programul tau trebuie sa ia informatia referitoare la  urmatorul container. El trebuie apoi sa mute containere cu macaraua (daca este necesar) si, eventual, sa stocheze, scoata sau sa refuze actiunea solicitata. 
Biblioteca:
Programul tau va utiliza o biblioteca numita StackLib.

Un exemplu de fisier sursa este prezentat in directorul problemei; el este TESTSTK.PAS. 
Scorul:
Programul va fi testat cu mai multe seturi de date; pentru fiecare set, performanta sa este determinata in raport cu solutia comisiei, folosind urmatorii indicatori:
* numarul total de miscari ale macaralei dat de programul tau
* o penalitate de 5 miscari este data pentru fiecare container refuzat
* o penalitate de 5 miscari este data pentru fiecare container nestocat care trebuie scos (adica programul se termina normal inainte de realizarea completa a operatiei).
* Scorul total va fi calculat relativ la cea mai buna solutie cunoscuta.
* Daca programul face mai mult de cat dublul numarului de operatii necesare, scorul este 0.
* Scorul minim este 0% iar scorul maxim este 100%.
  
Ziua 2                                          Stive  ROM


             04/12/97 (versiunea 2)                                                                       Pagina 1 din 2

